package demo;


/*
    在框架中写代码，第一个要确认的是继承或者实现
*/

import org.apache.hadoop.hive.ql.exec.UDFArgumentException;
import org.apache.hadoop.hive.ql.metadata.HiveException;
import org.apache.hadoop.hive.ql.udf.generic.GenericUDTF;
import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;
import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorFactory;
import org.apache.hadoop.hive.serde2.objectinspector.PrimitiveObjectInspector;
import org.apache.hadoop.hive.serde2.objectinspector.StructObjectInspector;
import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorFactory;

import java.util.ArrayList;
import java.util.List;

    // 自定义炸裂函数
public class MyUDTF extends GenericUDTF {

    // 定义初始化方法
    @Override
    public StructObjectInspector initialize(StructObjectInspector argOIs) throws UDFArgumentException {
        // 在输出的时候，默认字段别名，可以自己添加
        List<String> fieldNames = new ArrayList<>();
        // name 将作为炸出来的一列的字段名
        fieldNames.add("name");
        fieldNames.add("name_length");

        List<ObjectInspector> fieldOIs = new ArrayList<>();
        fieldOIs.add(PrimitiveObjectInspectorFactory.javaStringObjectInspector);
        fieldOIs.add(PrimitiveObjectInspectorFactory.javaStringObjectInspector);

        return ObjectInspectorFactory.getStandardStructObjectInspector(fieldNames,fieldOIs);
    }

    ArrayList<String> strings = new ArrayList<>();
//    String[] arr = new String[1];
    @Override
    public void process(Object[] args) throws HiveException {
        // 具体的逻辑代码
        // Object[] args 就是外面传入的值
        // select myudtf("zs,ls,ww,zl",",")
        String str = args[0].toString();
        String sp = args[1].toString();
        String[] arr = str.split(sp);

        for (String s : arr) {
//            ArrayList<String> strings = new ArrayList<>(); 提到外面了
            // ArrayList 存在的意义和价值是为了处理多列
            // 每次输出的时候，只会输出对应元素列数的个数
            strings.clear();
            strings.add(s);
            strings.add(Integer.toString(s.length()));
            // forward 运行一次 输出一行
            forward(strings);
        }
    }

    @Override
    public void close() throws HiveException {
        // 可以忽略
    }
}
